
public class MyQueue {
    //单链表实现队列
    static class ListNode {
        public int val;//数值域
        public ListNode next;//地址域

        public ListNode(int val) {
            this.val = val;
        }
    }

    public ListNode head;//头
    public ListNode tail;//尾
    public int uesdSize = 0;//元素个数

    //使用尾插法往队列里放元素
    public void offer(int val) {
        ListNode node = new ListNode(val);
        //如果链表是空的
        if (this.head == null) {
            //将头和尾指向node
            this.head = node;
            this.tail = node;
        }else {
            //链表不是空的 - 在队尾插入结点
            tail.next = node;//尾结点与node链接
            tail = tail.next;//尾结点指向下一个
        }
        this.uesdSize++;//个数加1
    }

    //出队列 - 删除单链表的头结点
    public int poll() {
        //若链表为空
        if (this.head == null) {
            return -1;
        }
        //链表不为空
        int ret = this.head.val;//接受当前头结点的值
        this.head = this.head.next;//head指向下一个
        if (this.head == null) {
            this.tail = null;
        }
        this.uesdSize--;//个数减1
        return ret;//ret就是出队的值
    }

    //只获取队头元素但不删除
    public int peek() {
        if (this.head == null) {
            return -1;
        }
        //不为空 - 返回值但不改变指向
        return this.head.val;//返回当前头结点的值
    }

    //测试队列是否为空
    public boolean empty() {
        return this.uesdSize == 0;//返回true或者false来决定是不是空
    }

    //求队列的元素个数
    public int getUesdSize() {
        return this.uesdSize;//直接返回元素的个数
    }

    public static void main(String[] args) {
        MyQueue myQueue = new MyQueue();
        //测试压入
        myQueue.offer(12);
        myQueue.offer(23);
        myQueue.offer(34);

        //测试弹出
        System.out.println(myQueue.poll());//12
        System.out.println(myQueue.poll());//23

        //测试获取
        System.out.println(myQueue.peek());//当前队头是34

        //测试是否为空
        System.out.println(myQueue.empty());//显然是false
        //测试元素个数
        System.out.println(myQueue.getUesdSize());//已经出队两个了，所以会输出1
    }
}
